package fileparse;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public final class ParserMgr {
	private static Map<String, IFileParser> parserMap;
	
	public ParserMgr()
	{
		if (parserMap == null) {
			parserMap = new TreeMap<String, IFileParser>();
		}
		if (parserMap != null && parserMap.isEmpty())
		{
			IFileParser docParser = new DocParser();
			IFileParser htmlParser = new HtmlParser();
			parserMap.put(".doc", docParser);
			parserMap.put(".wps", docParser);
			parserMap.put(".html", htmlParser);
		}
	}
	
	/**
	 * 解析dir中的所有文件，对应于的生成的txt文件保存在dstFolder路径下。
	 * 如果想解析不同格式的文件，并获取准确的解析信息，那么请设置不同的目标文件夹。
	 * @param dir
	 * @param dstFolder
	 * @param parseMgrInfor
	 * @throws IOException
	 */
	public void Parse(File srcFolder, File dstFolder, ParseMgrInfor parseMgrInfor, ParserMgrContext mgrContext) throws IOException
	{
		FileUtil.clearFiles(dstFolder, true);
		long nStart = System.currentTimeMillis();
		
		if (!dstFolder.exists() || dstFolder.isFile())
		{
			parseMgrInfor.parseResult = ParseResult.PR_Destination_Directroy_Not_Exist;
			return;
		}

		File[] subFiles = srcFolder.listFiles();	
		for (File file : subFiles){
			if (srcFolder.isDirectory() && mgrContext.isGetSubFiles()) {
				{
					File folder = new File(dstFolder.getCanonicalPath() + File.separator + srcFolder.getName());
					
					if (!folder.exists()) {
						folder.mkdir();
					}
					
					ParseMgrInfor mgrInfor = new ParseMgrInfor();
					this.Parse(file, folder, mgrInfor, mgrContext);
					parseMgrInfor.nSrcFilesSize += mgrInfor.nSrcFilesSize;
					parseMgrInfor.createdFileNum += mgrInfor.createdFileNum;
					parseMgrInfor.srcFileNum += mgrInfor.srcFileNum;
				}
			}
			
			else if (srcFolder.isFile() && srcFolder.length() >= mgrContext.getFileLength()) {
				String szfileFormat = "";
				
				//如果这个文件的文件类型不是上下文中指定的文件类型，跳过解析本文件。
				if (!srcFolder.getName().toLowerCase().endsWith(mgrContext.getParsedFileType().toLowerCase())) 
					continue;
				
				parseMgrInfor.srcFileNum++;
				parseMgrInfor.nSrcFilesSize += srcFolder.length();
				Set<String> set = parserMap.keySet();
				for (String strFormat : set)
				{
					szfileFormat = strFormat;
					String szFileName = srcFolder.getName();
					String szTmp = szFileName.toLowerCase();
					if (szTmp.endsWith(szfileFormat))
					{
						IFileParser parser = null;
						ParseInfor parseInfor = new ParseInfor();
						String szNewFilePath = dstFolder.getCanonicalPath() + File.separator + szFileName +  ".txt";
						File outFile = new File(szNewFilePath);
						dstFolder.createNewFile();
						
						parser = parserMap.get(szfileFormat);
						parser.Parse(srcFolder, outFile, parseInfor);
						parseMgrInfor.createdFileNum ++;
						break;
					}
				}
			}
			
		}
		parseMgrInfor.nCreatedFilesSize = FileUtil.CalculateSize(dstFolder, null, true);
		parseMgrInfor.nSpentTime = System.currentTimeMillis() - nStart;
	}
}
